
/**
 * \file Файл описания класса Coin
 *
 * Файл содержит определение класса для выполнения основных вычислений
 */
#ifndef COIN_H
#define COIN_H

#include <boost/circular_buffer.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/container/vector.hpp>
#include <boost/json/monotonic_resource.hpp>
#include "enums.h"
#include <iostream>
#include "websocketstream.h"

using namespace boost;


class Coin: public enable_shared_from_this<Coin> {
    Coin &operator = (const Coin &) = delete;
    Coin (const Coin &source) = delete;

    WebSocketStream m_websocketstream;
    std::string m_name;
    std::string m_host = "stream-testnet.bybit.com";
    std::string m_streamspot = "/v5/public/spot";
    std::string m_subscription;
    unsigned long long m_ts50;///метка формирования запроса 20 мсек ( 50 data)
    unsigned long long m_cts50;///метка генерации запроса 20 мсек ( 50 data)
    unsigned long long m_u50;///метка Update ID запроса 20 мсек ( 50 data) (ID = 0 рестарт на CEX)
    unsigned long long m_seq50;///метка перекрстной последовательности запроса 20 мсек ( 50 data)
    double m_bid50_value;
    double m_ask50_value;
    std::map <double, double> m_bid50;///биды 20 мсек ( 50 data)
    std::map <double, double, std::greater <double>> m_ask50;///аски 20 мсек ( 50 data)
    circular_buffer<std::map< double,  double>> m_bid50_hyst{50};///биды исторические 200 мсек
    circular_buffer<std::map< double,  double, std::greater <double>>> m_ask50_hyst{50};///аски исторические 200 мсек
    void GetOrder50Value();/// вычисление обЪема bid50 ask50

public:
    Coin(std::string name);
    ~Coin();
    void AddPublicStream();
    void StopWebSocket();
    void Show();
    void ParsePublicStream(beast::flat_buffer buffer);
};

#endif // COIN_H

